package com.atguigu.Service;

import com.atguigu.Dao.StudentDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

/**
 * @author Cheng-02
 * @version V1.0
 * @Package com.atguigu.Service
 * @date 2024/4/25 上午11:54
 */
@Transactional(timeout = 3)
@Service
public class StudentService {

    @Autowired
    private StudentDao studentDao;

    /*
     * 添加事务
     * @Transactional
     *
     * 位置：方法/类
     *
     * 方法：当前方法的事务
     *
     *
     * 1.只读模式
     *   只读模式可以提升查询事务的效率，推荐事务中只有查询代码，使用只读模式
     * 默认 boolean readonly（）default false
     *  一般情况下都是通过类添加注解添加事务
     * 类下的所有方法都有事务
     *  查询方法可以通过再次添加注解，设置为只读模式，提高效率
     *
     * 2.超时时间
     *  默认： -1  永远不超时
     *  设置timeout =时间 秒数 超过时间 就会回滚事务和释放异常  TransactionTimedOutException
     *
     *设置在类上的设置事务属性，方法也设置了 事务属性，方法不会生效
     *
     *
     *
     * 3.指定异常回滚，指定异常不会滚
     * 默认情况下：指定发生运行时异常事务才会回滚
     *   我们可以指定Exception异常来控制所有异常都回滚
     * rollbackFor = Exception.class
     *
     *
     *
     * */
    @Transactional(rollbackFor = Exception.class,isolation = Isolation.REPEATABLE_READ)
    public void changeInfo() throws FileNotFoundException {
        studentDao.updateAgeById(88, 1);

        new FileInputStream("xxxx");
        studentDao.updateNameById("test2", 1);
    }

    /**
     * 声明两个独立修改数据库的事务业务方法
     */
    @Transactional(propagation=Propagation.REQUIRED)
    public void changeAge(){
        studentDao.updateAgeById(998,1);
    }

    @Transactional(propagation=Propagation.REQUIRED)
    public void changeName(){
        studentDao.updateNameById("二狗子",1);
        int i = 1/0;
    }
    @Transactional(readOnly = true)
    public void getStudentInfo() {
        //查询，没有必要添加事务
        //获取数据库信息， 查询数据库，不修改
    }
}